const fs = require('fs').promises;
const path = require('path');
const axios = require('axios'); // 使用 axios 发送 POST 请求
const { fsExistsSync } = require('../app/util');

const folderPath = './src/theme/'; // 替换为你的文件夹路径
const apiUrl = 'https://xtest8.oemsaas.shop/homeapi/resources/themeupload'; // 替换为你的 API URL
const hwApiUrl = 'https://qzcyjrcd.shopiaas.com/homeapi/resources/themeupload'; // 替换为你的 API URL
const blacklist = ['.DS_Store', '.git', '.gitignore', 'sound20', 'quest', '.vscode', 'system', 'customtemp39391', 'customtemp29831', 'customtemp34484', 'default', 'test', 'component', 'nav-test'];
let links = [];
let errlinks = [];

async function readFilesRecursively(templateNmae,callback,dir) {
  if (!templateNmae) {
    console.log('请输入模板名称');
    return;
  }
  if (!dir) {
    dir = path.join(folderPath, templateNmae); // 构建完整路径
  }

  if (!fsExistsSync(dir)) {
    console.log('模板不存在');
    return;
  }
  const files = await fs.readdir(dir); // 异步读取文件夹内容
  for (const file of files) {
    const filePath = path.join(dir, file); // 获取完整路径
    const stats = await fs.stat(filePath); // 异步获取文件状态

    if (stats.isDirectory()) {
      // 如果是文件夹，递归调用
      if (!blacklist.includes(file)) {
        await readFilesRecursively(templateNmae,callback,filePath);
      }
    } else if (stats.isFile()) {
      // 如果是文件，读取内容并处理
      await processFile(filePath);
    }
  }
  // await fs.writeFile('./cdnlist.json', JSON.stringify(links), 'utf8');
  // await fs.writeFile('./err.json', JSON.stringify(errlinks), 'utf8');
  if (errlinks.length) {
    callApiSynchronously([...errlinks],callback);
    errlinks = [];
  } else {
    callback && callback();
  }
}

async function processFile(filePath) {
  const content = await fs.readFile(filePath, 'utf8'); // 异步读取文件内容
  const regex = /"src":\s*"(https?:\/\/[^"]+?)"/g; // 匹配包含域名的链接
  // const regex = /"src":\s*"(\/uploads\/themes.*?)"/g; // 匹配包含域名的链接

  let match;
  let modifiedContent = content;
  while ((match = regex.exec(content)) !== null) {
    const link = match[1].replace('/themes', ''); // 获取匹配到的链接
    console.log('需要处理的链接', link);
    links.push(link);
    const processedLink = await processLink(link); // 处理链接
    if (processedLink) {
      // 替换原链接为处理后的链接
      modifiedContent = modifiedContent.replace(link, processedLink);
    }
  }
  // 如果内容有修改，写回文件
  if (modifiedContent !== content) {
    await fs.writeFile(filePath, modifiedContent, 'utf8');
    console.log(`文件 ${filePath} 已更新`);
  }
}

async function processLink(link) {
  try {
    // 发送 POST 请求 "https://shopyy.oemsaas.cn"+ "https://shopyy.oemsaas.cn"+
    if (link.indexOf('http') === -1) {
      link = 'https://shopyy.oemsaas.cn' + link;
    }
    const [response, response2] = await Promise.all([axios.post(apiUrl, { url: link }), axios.post(hwApiUrl, { url: link })]);
    // const response = await axios.post(apiUrl, { url: "https://shopyy.oemsaas.cn"+link });
    if (response.status === 200 && response.data && !response.data.code) {
      // 如果请求成功，返回处理后的链接
      return '/' + response.data.data.path; // 假设返回的数据中包含处理后的链接
    } else {
      errlinks.push(link);
      console.warn(`处理链接 ${link} 失败:`, response.data.msg);
    }
  } catch (err) {
    errlinks.push(link);
    console.error(`处理链接 ${link} 时发生错误:`);
  }
  return null;
}

// 仅适用于 Node.js 18 及以上版本
async function callApiSynchronously(apiUrls,callback) {
  for (let i = 0; i < apiUrls.length; i++) {
    try {
      console.log('处理链接', apiUrls[i]);
      await processLink(apiUrls[i]);
    } catch (error) {
      console.error(`Error calling ${apiUrls[i]}:`, error);
    }
  }

  // await fs.writeFile('./err.json', JSON.stringify(errlinks), 'utf8');
  if (errlinks.length) {
    callApiSynchronously([...errlinks],callback);
    errlinks = [];
  } else {
    callback && callback();
  }
}

module.exports = {
  readFilesRecursively,
  processLink,
};

// // 调用递归函数
// readFilesRecursively(folderPath).catch((err) => {
//     console.error("发生错误:", err);
// });
